{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 零基础实战机器学习 源代码\n",
    "\n",
    "作者 黄佳\n",
    "\n",
    "极客时间专栏链接：https://time.geekbang.org/column/intro/438"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>订单号</th>\n",
       "      <th>产品码</th>\n",
       "      <th>消费日期</th>\n",
       "      <th>产品说明</th>\n",
       "      <th>数量</th>\n",
       "      <th>单价</th>\n",
       "      <th>用户码</th>\n",
       "      <th>城市</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>536374</td>\n",
       "      <td>21258</td>\n",
       "      <td>6/1/2020 9:09</td>\n",
       "      <td>五彩玫瑰五支装</td>\n",
       "      <td>32</td>\n",
       "      <td>10.95</td>\n",
       "      <td>15100</td>\n",
       "      <td>北京</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>536376</td>\n",
       "      <td>22114</td>\n",
       "      <td>6/1/2020 9:32</td>\n",
       "      <td>茉莉花白色25枝</td>\n",
       "      <td>48</td>\n",
       "      <td>3.45</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>536376</td>\n",
       "      <td>21733</td>\n",
       "      <td>6/1/2020 9:32</td>\n",
       "      <td>教师节向日葵3枝尤加利5枝</td>\n",
       "      <td>64</td>\n",
       "      <td>2.55</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>536378</td>\n",
       "      <td>22386</td>\n",
       "      <td>6/1/2020 9:37</td>\n",
       "      <td>百合粉色10花苞</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>536378</td>\n",
       "      <td>85099C</td>\n",
       "      <td>6/1/2020 9:37</td>\n",
       "      <td>橙黄香槟色康乃馨</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      订单号     产品码           消费日期           产品说明  数量     单价    用户码  城市\n",
       "0  536374   21258  6/1/2020 9:09        五彩玫瑰五支装  32  10.95  15100  北京\n",
       "1  536376   22114  6/1/2020 9:32       茉莉花白色25枝  48   3.45  15291  上海\n",
       "2  536376   21733  6/1/2020 9:32  教师节向日葵3枝尤加利5枝  64   2.55  15291  上海\n",
       "3  536378   22386  6/1/2020 9:37       百合粉色10花苞  10   1.95  14688  北京\n",
       "4  536378  85099C  6/1/2020 9:37       橙黄香槟色康乃馨  10   1.95  14688  北京"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd #导入Pandas\n",
    "df_sales = pd.read_csv('易速鲜花订单记录.csv') #载入数据\n",
    "df_sales.head() #显示头几行数据 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAs8AAAGWCAYAAACHG24VAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABb+0lEQVR4nO3dd3xV9f3H8dc3e13CzA0zYSRhiIggMhVUnDjq1ipia3Fbf9YOW1errbV2uequAwe1VauCe2BlKkv2JmwSNhlkf39/nBuMMUACuTnnnryfj4cPknNv7v18PHd87vd+v5+vsdYiIiIiIiKHFuV2ACIiIiIikULFs4iIiIhIPal4FhERERGpJxXPIiIiIiL1pOJZRERERKSeVDyLiIiIiNSTimcRkQhhjOlijDnxIJcbY8ylxpiYBt7uo8aYn9f4/c/GmJ/Wcb2RxphsY8yLxpjTjTGnGWNaGWPOM8bc2bBsREQiU4NeYEVE5MgZYzoAa4GFtS5KA1611v7qAH/aBfgjMKTGbcVaa8sBrLXWGHMTkGaMWQw8BJQAFkgM/ZwA/NRa+2WN230IeNIY8wRQBlwKHFfH/bcHLgtdJwZ4GDg+9N+e+mUvIhLZjDZJERFpWsaYtsBsa21mreO3Am2stXeFfu8EzOLbItvgFMHFod9bAIusteNr3MZJwPHW2gdq3fZGa22nOmJ5HehW41AiTpG+PPT7CGvtvtB1U3AK6NuBd3GK6M+AKcCHwDwgGlhorV1Tv/8bIiKRRSPPIiJNr/wgl1XW+nk18CNgMHA+UD094nNgNFBafWVjTKK19jOcgra+MoALrbW5xphrgE7W2ntDt5dbK55PcQr2nsBQoAgYAPQFpobi7ADcCqh4FhFfUvEsItL0LNDeGDO71vE04J81fo8CqoBBwIlANnBe6LIk4BxgPbDBGBMNfGWMASiy1g6uZywVwDvGmDKgLRBnjBkTuqx96P6rjQFeBnYBzwMnATuAxdbaXxljfgS0s9bOrOd9i4hEHBXPIiJNLwrYYq0dWPNgaNpGyxqHYoFya+1/jTE7cOYiXxi6LMVa+9fqK1prK4G+xpgewHMNiCUaOOcgI8/VscUA9wH3AjfjTCfpAFyAM8e6ekpHLiIiPqbiWUSk6bWgfiPPAWC3MaYNMAJnYV+1/xpjhllrp9Vx+w1ZzJLEwUee43BGp8/HWRh4cuh62cAca+1pxphfAZfjLDJ8pwH3LSIScVQ8i4g0vY7ANGvtSTUP1jHy3AVYh1Os/j50rCj0bzzQ/0B3YIxJxBm1rjhYINbao2v8zXdGnmt5E2eR4Jc4RfKpQPUCxOeA/4V+Xnyw+xMRiXQqnkVEmt4YoK4R49oGAquttctx2ji/AzyOsxjvl9baRQf4u2TgA+AOYHpdVzDGZAGv4bSvqxYE4o0xp9Q4Fg/caa390BjTHpgNvAH0Av5ojEkG9gL7cEaia86RFhHxHRXPIiJNyBgTBMZTo1dz6HgXoDuQF/rdAJfw7QJBcIrht4HtwLkHuIsTcEakx1trpxtjWuNMv6jZNQNr7Uqc4rxmDOOBjtbaew5w25uB93DmPf8eGA7MBx4APgHONsbcATx0qBFvEZFIpeJZRKRp3Q68bK1dVev4NcBpwA9Dvw8G8nHmPD+AszivD/A1kA68b4z5GtgC/NZ+27R/PjDOWvty6PchwJOh/w4lBmeR4vcYY7rj9HL+EDjLWrvFGDMVZyrH7dba140xjwMTcQrpr+txfyIiEUebpIiINDFjTHSoO8ahrpeKMyViHLAUmGutLQtdFsQZOa6w1n4YxnBrxhNXff81jsVolFlEmhMVzyIiIiIi9RTldgAiIiIiIpFCxbOIiIiISD1F1ILBtm3b2szMzCa/36KiIpKTk5v8fsNBuXiPX/IA5eJFfskDlItX+SUXv+QByqUxzJkzZ7u1tl1dl0VU8ZyZmcns2bU35Aq/KVOmMHLkyCa/33BQLt7jlzxAuXiRX/IA5eJVfsnFL3mAcmkMxph1B7pM0zZEREREROpJxbOIiIiISD2peBYRERERqScVzyIiIiIi9aTiWURERESknlQ8i4iIiIjUk4pnEREREZF6UvEsIiIiIlJPKp5FREREROpJxbOIiIiISD2peBYRERERqScVzyIiIiIi9aTiWURERMQn/vbxCl5eUup2GL4W43YAIiIiInLkdhaV8cQXq4k1VVhrMca4HZIvaeRZRERExAde+2o9ZRVVFJVDfoFGn8NFxbOIiIhIhCuvrOLlmetonRwHwPKtBS5H5F8qnkVEREQi3EeL89iyp4Rfnd4TgBV5Kp7DRcWziIiISIR7YfpaurRO4oIBnWgRp+I5nFQ8i4iIiESwRZv28HXuLsYOySA6ytAxJYrleYVuh+VbKp5FREREItiL03NJjI3mooGdAegUiGJlXgFVVdblyPxJxbOIiIhIhNpRWMrb32zmggEdSU2MBaBjShTFZZVs2r3P5ej8ScWziIiISISa+PUGyiqquGpI5v5jnVKc8k7znsNDxbOIiIhIBCqvrGLCjHWMyGpLVjCw/3iHUPG8XMVzWKh4FhEREYlAHy7eyta9JYwbmvmd40mxhg6pCaxQr+ewUPEsIiIiEoFenJ5Ll9ZJjMxJ+95l2ekBddwIExXPIiIiIhGmdnu62nKCAVbnF1JRWeVCdP6m4llEREQkwrwwPZekuG/b09WWHQxQVlnFup3FTRyZ/6l4FhEREYkg2wtLeWf+Zi44ttP+9nS1ZYcWEGrec+NT8SwiIiISQSZ+tZ6yyiquGppxwOv0SEvBGHXcCAcVzyIiIiIRoryyigkznfZ0PdICB7xeYlw0Ga2T1Os5DFQ8i4iIiESIDxdvJW9v6ffa09UlOxhguaZtNDoVzyIiIiIR4oVpuWS0SWJUHe3pastJD5C7o5jSisomiKz5UPEsIiIiEgEWbtzD7HW7GDskk6g62tPVlhUMUFllWbOtqAmiaz5UPIuIiIhEgG/b03Wq1/VzqjtuaN5zo1LxLCIiIuJx2wtLefebzVw4oBMtEupuT1db17bJxEQZzXtuZCqeRURERDzutVlOe7qxQzLr/TdxMVF0a5eskedGpuJZRERExMPKK6t4eVZ1e7qUBv1tdjDAirzCMEXWPKl4FhEREfGwDxY57emuHpbZ4L/NDgZYv7OY4rKKxg+smVLxLCIiIuJhL0x32tONzD50e7raqrfpXqnR50aj4llERETEoxZs3M2cdbu4qp7t6WrLSXeKZ23T3XhUPIuIiIh41AvTc0mOi+bCeranq61L6yTiY6JYoY4bjUbFs4iIiIgHbS8sZdI3WxrUnq626ChDj7QUVuRr2kZjUfEsIiIi4kH729MNzTyi28kJBjTy3IhUPIuIiIh4THllFRNmruOE7HZ0b9ew9nS1ZacH2Lq3hD3F5Y0UXfOm4llERETEY95ftJX8glKuPsJRZ6ixTXe+Rp8bg4pnEREREY95YdpaMtskcWJ2uyO+rezqjhuautEoVDyLiIiIeMg3G3Yzd/1urhp6eO3pauuQmkBKfAwr1a6uUah4FhEREfGQF6vb0w04vPZ0tRljyAqmqNdzI1HxLCIiIuIR2wpKmbTAaU8XOMz2dHXJCQZYvrUAa22j3WZzpeJZRERExCNe+6px2tPVlh0MsKu4nO2FZY16u81R2IpnY8wvjDEzjTHvG2NaGGMmGWO+McZMMI6E2sfCFYuIiIiI15VVVPHyzHWc2Ajt6Wqr3qZ7haZuHLGwFM/GmG5AH2vtYOB94FJgo7W2H9AKGA1cUccxERERkWbp/UVbyC8oZdywzEa/7aygU4yreD5yMWG63ZOBVsaY/wF5QAXwn9BlnwGjgAzgjVrHPgpTPCIiIiKe9sL0XLq2TebErCNvT1dbu5R4WiXFqnhuBCYcE8eNMb8Gultrf2yMmQEUAw9Yaz8xxlwDHAdkAg/VPGatvbaO2xoPjAcIBoMDJk6c2OjxHkphYSEpKY379YlblIv3+CUPUC5e5Jc8QLl4lV9ycTuPNXsq+d2MEn7YK47RGUe2UPBAuTwwax+VFu4cnHhEt9+U3Dovo0aNmmOtHVjXZeEaed4LLA/9vAZn2sY/Qr+nAtuBlNDPNY99j7X2aeBpgIEDB9qRI0eGJ+KDmDJlCm7cbzgoF+/xSx6gXLzIL3mAcvEqv+Tidh7v/Gs+yXFb+dUlI4+4y8aBcvlszyLenLuJE088kUhZaub2ealLuBYMzgGqq/UewB3AqaHfTwI+Bz6t45iIiIhIs5JfUMK7CzZz0cDOjdqerrbsYIDC0go27ykJ2300B2Epnq21M4AdxpivcUagHwY6GmMWADtxCudX6jgmIiIi0qy8NmsD5ZWWsUMywno/2UF13GgM4Zq2gbX2+lqHxtT6vbSOYyIiIiLNRllFFS/PWsfInHZ0a+T2dLVlV3fc2FrAqJy0sN6Xn2mTFBERERGXvL9oC9sKShnXyJui1KVlUhzBFvHapvsIqXgWERERccnz03Lp1jaZE8LQnq4u2cGApm0cIRXPIiIiIi6Yv2E38zfsZuyQDKKimqb7RU4wwMq8QiqrGr9VcXOh4llERETEBS9OzyUlPoYLBnRqsvvMDgYorahiw87iJrtPv1HxLCIiItLE8gtKmLRgMxcO6BTW9nS1Zac7HTc07/nwqXgWERERaWKvzlpPeaXlqiZYKFhTVtq3HTfk8Kh4FhEREWlCZRVVvDxzPaNy2tG1bXKT3ndyfAydWydq5PkIqHgWERERaULvLdzC9sJSxg3r6sr9Vy8alMOj4llERESkCb0w3WlPN6JHW1fuPysYYPW2Qsoqqly5/0in4llERESkicxbv4v5G3Zz1dDMJmtPV1tOMEBFlSV3R5Er9x/pVDyLiIiINBE32tPVlh0MddzQosHDouJZREREpAnk7y1h8sItXDSwEynxMa7F0a1dMtFRRjsNHiYVzyIiIiJN4JVZ66moslw1JNPVOBJio8lsk6Ti+TCpeBYREREJs7KKKl6ZtZ5ROWlkNnF7urpkBwOsUMeNw6LiWURERCTMqtvTNfWmKAeSHQyQu6OIkvJKt0OJOCqeRURERMLs+em5dGvnXnu62nLSA1gLq/I1+txQKp5FREREwmje+l18s2E341xsT1ebOm4cPhXPIiIiImH0wvRcAvExnH+se+3pastsk0RcdBQr8lU8N5SKZxEREZEwydtbwuQFW7hoYGdX29PVFhMdRbd2yazQyHODqXgWERERCZNXZq2n0lrGDslwO5TvyUlXx43DoeJZREREJAxKKyp51UPt6WrLDgbYtHsfBSXlbocSUVQ8i4iIiIRBdXu6cR5pT1dbTmjRoEafG0bFs4iIiEgjs9by/LRcurdLZkSWN9rT1ZaT7hTPK7XTYIOoeBYRERFpZPM27GbBxj2MG5qJMd5oT1dbx5aJJMZGs1zFc4OoeBYRERFpZC9M8157utqiogzZwRRWqHhuEBXPIiIiIo0ob28J7y3cwsXHdSbZQ+3p6pIdDLB8q+Y8N4SKZxEREZFG5OX2dLXlpAfYXljKzqIyt0OJGCqeRURERBqJ055uHSflpJHRxnvt6WrL3t9xQ1M36kvFs4iIiEgjmbxgC9sLyxg3LNPtUOpFxXPDqXgWERERaQTV7el6pKUwvIc329PVFmwRT4uEGJZrm+56U/EsIiIi0gjmrt/Nwk17uMrD7elqM8aEtulW8VxfKp5FREREGsEL03MJJMRwfv+ObofSIE7HjQKstW6HEhFUPIuIiIgcoby9Jby/cAsXD/R+e7ractID7C2pIL+g1O1QIoKKZxEREZEj9MrMdRHTnq62rDRn0aDmPdePimcRERGRI1BaUckrs9Zzcs/IaE9XW3YwBVDHjfpS8SwiIiJyBCZ9s4UdRWWMG9rV7VAOS5uUeNqmxGvkuZ5UPIuIiIgcJmstL0x32tMN69HG7XAOW056ikae60nFs4iIiMhhmrt+Fws37WFcBLWnq0t2MMDK/EKqqtRx41BUPIuIiIgcphemryOQEMMPIqw9XW3ZwQDFZZVs2r3P7VA8T8WziIiIyGHYusdpT3dJBLanq616m27Nez40Fc8iIiIih+GVWdXt6TLdDuWIVXfcWK55z4ek4llERESkgUrKK3l11npO7hmkS5skt8M5YoGEWDq2TNSiwXpQ8SwiIiLSQJMWOO3prh6W6XYojSY7mMKKvEK3w/A8Fc8iIiIiDeC0p1tLVloKQ7tHbnu62rKDAVbnF1JRWeV2KJ6m4llERESkAeau38WiTXu5KsLb09WWHQxQVllF7o5it0PxNBXPIiIiIg3w/LRcAgkxnH9sZLenqy0n3em4oXnPB6fiWURERKSetuzZx/uLtnLpcZ1Jiovs9nS19UhLwRi1qzsUFc8iIiIi9fTKzPVU+aQ9XW0JsdFktE5iZb6K54NR8SwiIiJSDyXllbz61XpO6RWkc+vIb09Xl+xgQCPPh6DiWURERKQe3v1mMzuLyrh6aKbboYRNTnqA3B3FlJRXuh2KZ6l4FhERETkEpz1dLtnBFIb4qD1dbdnBAJVVljXbitwOxbNUPIuIiIgcwpx1u1i82X/t6WpTx41DU/EsIiIicgjPT8+lRUIMP+jvr/Z0tWW2SSYmyqh4PoiwFM/GmOOMMRuNMVND//UzxkwyxnxjjJlgHAm1j4UjFhEREZEjsWXPPj5YtJVLB3XxXXu62uJioujWLlnF80GEa+S5FfCEtXa4tXY4cByw0VrbL3TZaOCKOo6JiIiIeMrLM9dhreXKwRluh9IksoMBlqt4PqBwFs8XGGO+Msa8AZwMfBy67DNgFHBSHcdEREREPKOkvJLXvtrg6/Z0teUEA2zYuY+i0gq3Q/EkY61t/Bs1ZgCQbq2dbIyZDgwAzrLWfmKMuQZnJDoTeKjmMWvttXXc1nhgPEAwGBwwceLERo/3UAoLC0lJSWny+w0H5eI9fskDlIsX+SUPUC5e5ZdcDpTHlxvLeW5RGb84LoHebaJdiKzhjvSczMmr4NF5pdw9OIFuLd3N2a3H16hRo+ZYawfWdVm4Ju7kAotq/NwfSA39ngpsB1LqOPY91tqngacBBg4caEeOHBmOeA9qypQpuHG/4aBcvMcveYBy8SK/5AHKxav8kktdeVhreejRqWQH47j+/BMipsvGkZ6TjO1FPDpvCimdshk5sHPjBXYYvPj4Cte0jduAS40xUcBRwM+AU0OXnQR8DnxaxzERERERT5gdak83bmjXiCmcG0OX1knEx0SxQjsN1ilcxfNjwNXALOAt4DmgozFmAbATp3B+pY5jIiIiIp7wwrRcUhNjOa9/B7dDaVLRUYasYIoWDR5AWKZtWGu3ACNrHR5T6/fSOo6JiIiIuG7z7n18sHgr1wzv6vv2dHXJDgaYtqrOGbXNnjZJEREREamluj3dFc2kPV1tOcEAeXtL2VNc7nYonqPiWURERKQGpz3d+mbVnq627GBom+58Td2oTcWziIiISA3vfLOZXcXljBuW6XYorslOd4rn5Vo0+D0qnkVERERCrLW8MC2XnGCAId3auB2OazqkJpASH6Ntuuug4llEREQk5OvcXSzZspdxwzKbVXu62owxZAdTNPJcBxXPIiIiIiEvTF/rtKc7pqPbobguJz3AirwCwrEbdSRT8SwiIiKC057uw8V5XDqoM4lxkbEVdzhlpQXYVVzO9sIyt0PxFBXPIiIiInzbnu7KZtqerrac0KJBzXv+LhXPIiIi0uyVVVpe+2o9o3sH6dSqebanq626XZ3mPX+XimcRERFp9mZuqXDa0w3t6nYontE2JY7WyXEaea5FxbOIiIg0a9ZaPl5XQc/0AIO7tXY7HM/Y33FDxfN3qHgWERGRZqukvJJ/TstlQ0EV44Y27/Z0dckOBliZV6iOGzXEuB2AiIiISFPL21vChBnrePWr9ewsKqNbahTnqj3d92QHAxSWVrB5TwkdWya6HY4nqHgWERGRZmP+ht08P20tkxdsodJaTu4Z5EfDMyldv1Dt6eqwv+PG1gIVzyEqnkVERMTXyiur+GDRVv45bS3z1u8mJT6GsUMyuWpoBhltkgGYskHTNeqSnRbquJFXwKieaS5H4w0qnkVERMSXdhWV8drX63lp+jq27i0ho00S95zdmwsHdCKQEOt2eBEhNSmW9BYJrFC7uv1UPIuIiIivrMgr4Plpa3lr3iZKyqsY1qMNv//BUYzKSSMqSiPMDZUVTGFFvornaiqeRUREJOJVVVk+X57P89NymbpqO/ExUZx/bEfGDe26f96uHJ6cYIAJM9dRWWWJ1ocPFc8iIiISuQpLK/j37A28OD2X3B3FpLdI4Oen5XDZoC60To5zOzxfyE4PUFpRxfqdxXRtm+x2OK5T8SwiIiIRZ/2OYl6Ynsu/Z2+goLSC/l1actupOZxxVDqx0drGojHl1NimW8WzimcRERGJENZaZqzZwfPTcvlkaR7RxnDW0e25elhXjunc0u3wfCsrmAI4c8lPPyrd5Wjcp+JZREREPK2kvJJ35m/mn9PWsmxrAa2T47hxZA+uGJxBemqC2+H5XlJcDJ1bJ7JC23QDKp5FRETEo2rvAtgzPcCDF/Tl3GM6khCrDU2aUk4woOI5RMWziIiIeErtXQBP6RXk6mGZDOnWBmPU7cEN2cEAU5Zvo6yiiriY5j2nXMWziIiIuK56F8Dnp61l7gF2ART35KQHqKiyrN1e1Oxb/6l4FhEREddU7wI4YcY6tuzRLoBelR38dptuFc8iIiIiTayuXQDvP0+7AHpVt3bJREcZVmres4pnERERaRraBTByxcdEk9kmieVbVTyreBYREZGwKiyt4D+zN/DijHWs3V6kXQAjVE56gCWb97odhutUPIuIiEhY1N4F8NguLbntsv6crl0AI1J2MMD7i7ayr6ySxLjm2yrwkMWzMSYIdLbWzq7jsuOstV+HJTIRERGJONoF0L9yggGshVX5hfTtlOp2OK6pz8hzZ+AlY8xMYBMwD3gfOAn4NTAsfOGJiIhIJNAugP6XFeq4sSKvQMXzgRhj2gNVwGvAEziF9HmhnzcAp4Q5PhEREfGwXSVV/OWj5bwyS7sA+l1mmyTioqOa/U6Dhxp5/iPQF9gFbAeOAuKAS4AbgcHAB+EMUERERLynpLySO/+7iLfm7qOKVdoFsBmIiY6ie1oKy1U8H9RPgb3AHUAfINda+xCAMWY18K4xZoq1tiS8YYqIiIiXPP2/NfxnzkZO6RLDXZcM1y6AzUROMIWv1u50OwxXHWqp60+A64FRQAbwkTHmHWPMlcDrwDgVziIiIs3Lxl3FPP75Ks7q254resercG5GstMDbN5Twt6ScrdDcc2hiueWQBrQCVgOGCAZSAVigW/CGZyIiIh4z+8nL8UY+PVZvdwORZpYdpqzaHBlXqHLkbjnUMXz+8BMoD1OEX02kAMcgzPyfHs4gxMRERFvmbpyO+8v2spNo3rQsWWi2+FIE6veCbI5Lxo8VPE8HKgEZgGLgLnAemC+tfZPwAhjjJbSioiINAPllVXc++5iurRO4poR3dwOR1zQsWUiSXHRzXqb7oMuGLTW/hHAGLMKWAe0ASZYa58IXeX3OFM5RERExOdenJ7LqvxCnrtqoNrQNVNRUYasYEAjz4dirV1jra201uZba58wxlwWOj7LWlsR3hBFRETEbfl7S/j7JysZldOOk3sF3Q5HXJQTTFHxfDDGmCxjzFXGmLGhf3sDY5sgNhEREfGIP36wjLKKKu4+u4/boYjLsoMBtheWsaOw1O1QXHHQ4tkY0wYYAvQEfo7TfWMU0Hz7k4iIiDQzc9bt5M25m7hmRFe6tlVbuuYue/823c2z48YBi2djTCtgKvBDnF0EtwD/bqK4RERExAMqqyx3v72Y9BYJ3Diqh9vhiAc0944bByyerbW7gH7AfOA0nHZ1FwHHA51CUziuaYogRURExB0Tv17P4s17+c1ZvUiOP9TGxNIcpAXiSU2MbbbbdB9qznMKzuYoVYDFaVtX/XNV6HcRERHxoV1FZTz04XIGd2vNmKPbux2OeIQxhpxggBXNtF3dAT9ChqZtTMHZKOU9YBDwJk7h3NpaO6EpAhQRERF3/OXj5RSUVHDvOX0wRp1p5VtZwRTe/WYz1tpm99g41LSNC4AlwK+APsBfmyguERERcdGiTXt4ZdZ6rhycQc/0Fm6HIx6Tkx5gb0kFeXubX8eNQ22SstIYsx2YjtNhIwbYBYxpgthERETEBdZa7n1nMa2T4vi/0dluhyMeVN1xY3leAempCS5H07QO1aouChhorV1prc211q6y1u4Aftc04YmIiEhT++/8Tcxet4tfnt6T1MRYt8MRD9rfrq4Zzns+1IJBC9z+vYPWzghPOCIiIuKmgpJy/vDeMvp1bsmFAzq5HY54VOvkONoF4ptlx41DTduwxpj2xpi6dhS0wFxr7eLwhCYiIiJN7dHPVrGtoJRnxg4kKqp5LQSThskOprCyGRbPh9yeG6dIrsBpS1fzvyhgYvhCExERkaa0Kr+Af05dyyUDO3NM55ZuhyMelx0MsCKvkKoq63YoTao+3c43W2tfreuC0PbdB2SMuQ04E2eB4X+AzsACYCwQX/uYtbZ5/d8XERHxCGstv313CYlx0fz89By3w5EIkBMMsK+8ko279tGlTZLb4TSZQy0YjAG+t1LAGHO8MaadtfaAreuMMRnAVaFfrwA2Wmv7Aa2A0Qc4JiIiIi74cHEeX67czs9GZ9M2Jd7tcCQCZKd/23GjOTlo8WytrQDGAxhjuhljuhhjugAdgdeNMSkH+fOHgTtCP58EfBz6+TNg1AGOiYiISBPbV1bJfZOW0DM9wBWDM9wORyJEVppTBq5oZsWzOdhMCWPMmcCfgdNxej1/BFSvHkgH5lhr76zj7y4HcoDngWdx5kg/ZK39xBhzDXAckFn7mLX22jpuazyhAj4YDA6YOLFpp1lvLqxi465iBnU+2OeEyFFYWEhKinLxEr/kAcrFi/ySByiXcHprZRlvry7nV4MS6Nk6ukF/67VcDpdf8oCmzeVnU4rJahXFdf3C0+vZrfMyatSoOdbagXVddqg5z4uAIcBeYKW19kc1Lwz1ga7LGKALcBpOEV0FpIYuSwW2Ayl1HPsea+3TwNMAAwcOtCNHjjxEyI3r8mdmsnDDPq67aBgtEiK/1+WUKVNo6v+H4eKXXPySBygXL/JLHqBcwmXDzmLe/+QLzu7XgevO79/gv/dSLkfCL3lA0+Zy9Nqv2LKnhJEjTwjL7XvxvBxq2sZ6a+2e0EK+n9RxedUB/u5ya+1w4FJgDvBz4NTQxScBnwOf1nHMc+44oxeFZfD456vcDkVERKTR3TdpCdHG8Osze7odikSg7PQAa7YVUV5ZZ0noS/VpVQeAtfZIqsdXgI7GmAXATpzCua5jntO3UypDO8Tw/NRc1u8odjscERGRRvPFim18tCSPm0/uQfvURLfDkQiUEwxQVlnFuh1FbofSZOpdPB+O0Jbep1hrS621Y6y1R1trr7SO7x0LZyxH4sLsWKKjDA+8v9TtUERERBpFWUUVv31nMV3bJvPj4V3dDkci1P5tuvMKXY6k6YS1ePaLVglRXD+yO+8v2sqsNTvcDkdEROSIPT9tLWu2F3H3mN7ExzRskaBItR5pKRgDy7c2n44bKp7r6ScjutE+NYH7Jy9tdjvpiIiIv+TtLeGRT1dySq80RvVMczsciWAJsdFktkluVu3qVDzXU2JcNL88vScLN+3hzXmb3A5HRETksD3w3lLKqyx3jentdijiA9nBlGa1UYqK5wY4p18H+nVuyUMfLqOotMLtcERERBrsq7U7+e/8zVx7Qjcy2iS7HY74QE4wQO72IkrKK90OpUmoeG6AqCjD3WN6k7e3lKe+WO12OCIiB1VUWsHeMk0zk29VVlnueWcxHVITuGFkD7fDEZ/ICgaosrBmW/PouHGoTVKklgEZrTi7Xwee/nINlw7qQoeWau0jIk3PWsvOojI27d7Hpl372LR7HxtD/27e7fy7u7gcgCWVy/jZqdnERmu8pLl7ddY6lm7Zy+OXH0tinBYJSuPISa/uuFFA7w4tXI4m/FQ8H4Zfnp7DR4u38qcPlvH3Sxu+G5OIyKFUVFaRV1AaKoyL2by7ZH9xvGmX8/u+Wl+RJsVF07FlIh1bJXJM55Z0bJXIjIWrefKL1czO3ckjl/XXB/5mbGdRGX/+aAVDu7fhzL7pbocjPpLZJpnYaNNs5j2reD4MnVolcc2Irjz++WrGDevKMZ1buh2SiESYkvLK/SPEm3Z9++/G0L9b95ZQWauzT+vkODq2TCQrLcDInLT9hXLHlol0apVIamIsxpjv/E1vNnLhiKP49ZsLOeuRL/nrxceou0Iz9dCHyyksreDec/p873EiciTiYqLo1jaFFc2kXZ2K58N0/cgevD57I797dzFvXD9UL0Qi8h179pXXKIqLnX9rFMrbC8u+c/0oA+ktEujYKpHjMluFiuKk0L8JdGiZSFLc4b1kn3tMR/p2TOXGV+dx9Qtfc+2J3bj91BxN42hGFmzczcSv1/OjYV33b2oh0piy0wPMW7/L7TCahIrnw5QSH8Ptp2bzyzcW8u6CLZzTr4PbIYlIE6mqsmwvLN0/SlyzKN4c+rmgVkee+Jio/SPFvdq32P9zh5bOyHF6akJYi9lu7VJ464ah/G7SEp76Yg2zc3fxqKZxNAtVoUWCbZLj+ekpWW6HIz6VnZbCu99spqi0guR4f5eX/s4uzC4c0JkXp6/jwfeXcWrvIAmxWnwh4gfllVXkF1cxffV2Nu8u2T/vuLpI3ry7hLLKqu/8TYuEGDq2SqJTqyQGd2tDh5YJNUaOE2mbEuf6N1QJsdH84Qd9GdytDXe8sYAzH/mSv1zUj5N7BV2NS8LrzXmbmLd+Nw9deDQtEmLdDkd8Kju0aHBlfqHvp7OqeD4C0VGGu8b05rJnZvLc1LXcOEptf0Qi3ar8Qi59eoYzreJ/s/YfTwvE07FVIn06pnJan/T9RXH1v4EIKkrO6deBvh1TueGVufz4xdlce0I3bj9N0zj8aG9JOX98fyn9u7TkgmM7uR2O+FhOaDrQiq0FKp7l4IZ0b8OpvYP84/NVXDSwE2mBBLdDEpHDtKe4nJ+8NBtr4eqj4jhlcH86tkykfcsE4mP89c1S17bJvHXDUO6fvISn/reGr3N38ujlx9JR0zh85eFPVrKjqIznxw0iKkprcyR8OrdOIiE2qll03NAwQyP49Zm9KKus4i8frnA7FBE5TBWVVdz02lw27irmySsHcGKnWIb1aEtm22TfFc7VEmKjuf+8vjx2eX9W5BVy5sNf8smSPLfDkkayIq+AF6bnculxXejbKdXtcMTnoqMMWWkBVqh4lvrIbJvMVUMyeX3OBhZt2uN2OCJyGB54fxlfrtzO/ecdxXGZrd0Op0mNOboDk24eTqdWiVzz0mx+P3kJ5bXmdEtksdZy7zuLSYmP4een5bgdjjQTWcEUFc9SfzefnEXLxFjun7wEa7Udrkgk+ffsDTw3dS3jhmZyyXFd3A7HFZltk3nj+qFcOTiDZ75cy8VPzWDjrmK3w5LD9P6irUxfvYPbT82mdXKc2+FIM5ETDJC3t5TdxWWHvnIEU/HcSFITY7ltdDYz1+zkI33tKRIx5qzbxW/eWsTwHm2586xebofjqoTYaO477ygev/xYVuYVctYjUzWNIwIVl1Vw/6Ql9GrfgsuPz3A7HGlGsvdv013ociThpeK5EV02qAtZaSk88N5Syir0laeI123Zs49rJ8yhfcsEHru8PzHqNgHAWUe3/840jvsnLdFrWgR5YspqNu8p4bfn9CFaiwSlCVV33PD7okG9UzSimOgofnNWL3J3FPPSjFy3wxGRg9hXVsn4l+ZQUl7Js2MH0jJJX23XVD2NY+yQDJ6dqmkckWLdjiKe+mIN5x3TgUFdm9fcfXFf+9QEAvExvt+mW8VzIxuZk8aJ2e14+NOV7CgsdTscEamDtZZfvLGARZv38PClx5Cl7YrrlBAbze/OPYp//PBYVuc73Tg+WrzV7bDkIO6btITYaMMdZzbvKUjiDmNMs1g0qOI5DO48qxfFZZX8/ZOVbociInX4x5TVvPvNZn5+Wo5216uHM/u2Z9Itw+nSJonxE+Zwn6ZxeNLny/L5ZGk+t5ycRbCF9hwQd+SkO+3q/Nw8QcVzGGQFA/zw+C68+tV6Vvr805dIpPl4SR5//mg55/TrwPUndnc7nIiR0caZxjFuaCbPTV3LRU/NYMNOTePwitKKSn777mK6tUvm6mFd3Q5HmrHsYIBdxeVs8/G37yqew+TWU7JJiovm/slL3Q5FREJW5BVw68R5HNUhlT9deDTGaDFVQ8THRHPvOX144ofHsia/kLMe+ZIPNY3DE56bupbcHcXcc3Yf4mL01i7u+Xabbv923NAzLExaJ8fx05Oz+GLFNqYsz3c7HJFmb1dRGde8OJuk+BieHjuAhFh/7hrYFM7o257Jt4wgs20y106Yw2/fXaxpHC7asmcfj366ilN7Bzkxu53b4UgzV92uzs8dN1Q8h9HYIZlktkni/slLqdBuXSKuKa+s4sZX57J1TwlPXTmA9qmJbocU8bq0SeLf1w1h3NBMnp+Wy0VPTtc0Dpf84b1lVFnLXWN6ux2KCG1T4mmdHOfraasqnsMoLiaKX5/Zi1X5hbz61Xq3wxFptn4/eSnTV+/gD+f35dgurdwOxzeqp3E8ecWxrNlexJmPfMkHizSNoynNXLODd7/ZzHUndqdz6yS3wxEBIDuYopFnOXyjewcZ0q0Nf/t4BXuKy90OR6TZee2r9bwwPZdrhnflwgGd3A7Hl04/qj3v3TKCrm2Tue7lOdz7zmJKKyrdDsv3KiqruPedxXRsmcj1I7X4VbwjJxhgxVb/dtxQ8RxmxhjuHNOL3fvKefQzta4TaUpfrd3J3W8v4oTsdvzqjJ5uh+NrnVs70ziuHpbJC9NzuejJGazfoWkc4fTyzHUs21rAXWN6aQ6/eEp2eoCisko27d7ndihhoeK5CfTpkMrFAzrz4oxc1m4vcjsckWZh465irn95Dp1bJfHoZdp6uynEx0Rzz9l9ePKKAazdXsRZj37JB4u2uB2WL20vLOUvH69gRFZbTuuT7nY4It+xv+OGT6du6N2kifzstGzioqN44D21rhMJt+KyCn7y0hzKKqt45qqBpCbGuh1Ss3L6Uem8d8sIurVN5rqX52oaRxg89MFy9pVVcs/ZfdRyUTwna3/x7M92dSqem0haIIEbRvXgoyV5TF+93e1wRHzLWsvt//6G5Vv38shl/eneLsXtkJolZxrHUH40rCsvTM/lwic0jaOxzN+wm9fnbOBHw7vSI02Pb/Ge1MRY0lsksGKrRp7lCP14eFc6tkzkvklLqazy5yR6Ebc9+tkq3lu4lTvO6MWonDS3w2nW4mKiuPvs3jx15QDW7SjirEe+5L2FmsZxJKqqLPe8vYi2KfHcfFIPt8MROaDs9IBvO26oeG5CCbHR/OqMnizdspf/zNngdjgivvPBoq389eMVnH9sR64ZoS2KveK0PulMvmUE3dJSuOGVudzz9iJN4zhM/5mzkW827uGOM3oSSNB0JPGunGAKK/MLfTlYqOK5iY05uj0DMlrx0IcrKCytcDsccVFZRRV3v72IX31ZzLz1u9wOJ+It3bKX216fzzGdW/KHH/TVPFCP6dw6iX9fO4RrhnflxRnruOCJ6azboQXUDbFnXzkPfrCMgRmt+EH/jm6HI3JQ2cEAZRVVvnyeq3huYsYY7hrTm+2FpTwxZZXb4YhL8veWcNkzM3lpxjqKyiyXPDWTV2et921PzHDbUVjKNS/OJpAQw9NXauttr4qLieLOMb15ZuxANuzcx5hHpjJ5gaZx1NffPl7BzuIy7j1HiwTF+7J9vGhQxbMLjunckh/078gzX67VdrbN0Jx1Oxnz6FSWbtnL45cfywMjkhjcvQ2/fmshv3xjASXl+jq7Icoqqrj+lblsKyzl6SsHktYiwe2Q5BBG9w4y+ZbhdE9L4cZX53LXfxfpcX8Iy7buZcLMdfzw+C4c1THV7XBEDikr6Cxm9WO7OhXPLvnF6TlEGXjwg2VuhyJNxFrLK7PWcenTM0mMi+atG4Zx1tHtSYkzPD/uOG4+qQevz97IRU/O0IeqBvjtu4v5au1O/nTB0fTr3NLtcKSeOrVK4vVrh/CTEV2ZMNOZxpGrPvh1stZyz9uLCSTE8LPROW6HI1IvSXExdGmd5MtFgyqeXdI+NZHxJ3Rn0oItzFm30+1wJMxKKyq5482F/OatRQzr0ZZ3bhxOTnpg/+XRUYafnZrDM2MHkru9iLMfm8r/VmxzMeLIMGHmOl6ZtZ7rTuzOeZoDGnHiYqL4zVnONI6Nu/Yx5tGpTFqw2e2wPGfSgi3MWruT20/NoVVynNvhiNRbdmibbr9R8eyi607sRrBFPL+btJQqH65GFcfWPSVc8tRMJn69gZtG9eC5q44jNanuVfKjewd55+bhBAMJXPX8Vzz++So9Ng5gxuod/PadxZzUM42fn6bRuEhWPY0jK5jCTa/O487/LtQ0jpCi0gp+P3kpfTq04LJBXdwOR6RBctJTWLu9iLKKKrdDaVQqnl2UFBfDz0/ryTcbdvPONxpt8aOv1jrzm1fmFfDkFcdy+2k5REcdfKFP17bJvHXjUMYc3YGHPlzOtS/PYW9JeRNFHBk27CzmhlfmkNk2mYcvPeaQ/0/F+6qncYw/oRsvz1zP+f+YzlpN4+Dxz1exdW8Jvzu3jx7nEnGygwEqqqzvnssqnl12fv+O9O2YyoMfLGNfmUZa/MJay0szcrn8mZkEEmL4743DOP2o9vX++6S4GB659BjuHtObz5blc95j03y56OJwFJZWcM2Ls6my8OzYgep16yOx0VH8+sxePHfVQDbv2cfZj07l3WY8sLB2exHPfrmW84/tyICM1m6HI9Jg1R03/DbvWcWzy6KinNZ1W/aU8PT/1rgdjjSCkvJKfv6fBdz99mJOzG7H2zcNIysYOPQf1mKM4UfDu/LqNcezt6SC8x6f1uzng1ZVWW7713xW5hfw2OX9yWyb7HZIEgYn9woy+ZYRZAdTuPm1efzmreY5jeN37y4mLiaKX53R0+1QRA5Lt3bJREcZ3817VvHsAYO6tubMvuk8+cVqtu4pcTscOQKbd+/j4qdm8J85G/npyVk8M3YgLY5wZPT4bm2YfMtweqYHuOnVedw/aQkVlf6aP1Zff/9kBR8tyePOs3ozIqud2+FIGHVsmci/rh3CtSd245VZ6/nBP6azubD5PO4/XZrH58u38dOTs0gLqP2iRKb4mGi6tk3WyLOEx69O70VlleWhD5e7HYocphmrd3D2o1NZs62IZ8YO5P9GZxPVSHMUgy0SmDh+CGOHZPDs1LX88NlZbCsobZTbjhSTFmzmkc9WcfHATlw9LNPtcKQJxEZHcccZvfjnuIFs2bOPX091pnI8/MlKFm3a49tNhUrKK/ntu0vokZbCOD3WJcLlBAO+m3ao4tkjurRJ4urhmbwxdyMLN+5xOxxpAGst/5y6liuem0XLpFj+e+MwRvcONvr9xMVE8btzj+KvF/dj/obdnP3oVOY2k229F23aw+3//oYBGa2477yjtLtaM3NSzyAf3noCF2bFEhtt+PunKxjz6FSG/vEzfvPWQj5fnu+raR3PfrmG9TuLuffsPsRG621aIltWMIX1O4t9ta4rxu0A5Fs3jerBf2Zv5HeTFvP6tUNUIESAkvJKfv3mQt6ct4nRvYP89eJ+YV/Adv6xnchJD3Ddy3O45KkZ3H12H644votvHy/bCkoZ/9JsWiXF8eQVA4iP0dbbzVGwRQJjuscxcuQwtheW8tmyfD5dmsdb8zbxyqz1JMVFM7xHW07pHeSknmm0TYl3O+TDsmn3Ph77fBVnHJXO8Ky2bocjcsRyggGshVX5hfTt5I/dMVU8e0ggIZafnZrDr99ayPuLtnJm3/p3Z5Cmt2FnMde9PIclW/Zy2+hsbhrVo9GmaRxKnw6pvHvTcG7913zu+u8i5q/fze9/cBQJsf4qLEsrKrn+5TnsLC7jP9cNpV0gMgsiaVxtU+K5eGBnLh7YmZLySmas2cGnS/P4dGk+Hy3Jwxg4pnNLTukV5JReQbKDKRHz4fIPk5cC8JuzerkciUjjyE7/tuOGimcJi0uO68xLM3J54P2lnNQzzXfFkF9MW7Wdm16dS0WV5bmrBnJSz8afpnEoLZPi+OdVx/Hwpyt5+NOVLNu6lyevGEDn1klNHks4WGu5+7+Lmb1uF49d3p+jOvrjRVcaV0JsNKNy0hiVk8Z951qWbNnLJ0vy+XRZHg99uJyHPlxOp1aJ+wvpQV1bExfjzakQ01dtZ/LCLfzfKdl0auWP57FIRusk4mKifDXvWcWzx0RHGe48qzdXPDeLF6bnct2J3d0OSWqw1vLsl2t54P2ldG+XwtNjB9LVxXZpUVGG/xudTb/Oqdw6cT5jHp3KI5f158TsyO9E8eL0XP4129mVcczRHdwORyKAMYY+HVLp0yGVn56SRd7eEj5d6kzveO2r9bwwPZdAfAwnZLfjlN5pjMxO88x21+WVVdzzzmI6t07k2hO7uR2OSKOJiY6iR7sUlvuoXZ2KZw8antWWk3um8dhnq7jg2E76qtoj9pVV8ss3FvDON5s546h0HrqoHynx3ngKndQzyLs3D+faCXMY9/xX3HZKNjc24TSSxjZ15Xbum7yU0b2D3DY62+1wJEIFWyRw+fFduPz4Luwrq2Taqu18sjSPT5flM3nhFqIMDMxozSm90zi5V5Du7VJci/WlGetYmV/I01cO0DeO4jvZwRS+WrvT7TAajTe/uxJ+fVYvSsor+evHK9wORXDmN5//xHTeXbCZn5+Wwz9+eKxnCudqGW2SeeuGYZzbrwN/+XgF4yfMZs++yNvWO3d7ETe+Opfu7ZL52yXHROwHAPGWxLhoTukd5I8XHM2sO07m7RuHceOoHhSUVvCH95Zx8l++YNSfp3D/pCXMXLOjSXupbyso5e8fr+DE7HZh6dQj4rbs9ACb95SwtyTy3pPq4q13f9mve7sUrhySwYvTc7lqaAY901u4HVKz9b8V27hl4jyqqizPjzuOkTlpbod0QIlx0fztkmM4pnNL7p+8lHMfm8pTVw4kJ73hOxy6oaCknGtemo0x8OzY4zz3AUX8ISrK0K9zS/p1bsnPTs1h465iPluWzydL83lpxjqenbqW1MRYRua045ReQU7MaXfEmx0dzIMfLKOkopJ7zu4dMQsbRRoiJ7TL7sq8Al9sNa93Jg/76clZvDl3E/dPWsqEHw/Si2oTs9by5BdreOjDZWQHAzx15QAy2nh/O2hjDOOGdaVPx1RueGUu5z0+jQcvPJpz+nl73nBlleWnE+ezdnsRE348iC5ttGBKmkanVkmMHZLJ2CGZFJZW8OWKbXyyNJ/Pl+fz9vzNxEQZBnVtvX/RYWM+Nueu38V/5mzk2hO70c3FaSMi4ZQdKp6Xby1U8Szh1TIpjltPyeK37y7hs2X5nNxLX+c1laLSCn7xnwVMXriFs45uz0MXHk1SXGQ9XY7LbM3km4dz46tzueW1ecxfv5s7zuzp2U0X/vzRcj5bls995/ZhaHf1txV3pMTHcEbf9pzRtz2VVZb5G3bx8RJn0eHvJi3hd5OWkJWWwim9g5zSK41jOrci+jCnFlVWWe55ezHBFvHcfFJWI2ci4h0dWyaSHBftm44bYakGjDExwGtAB2A5cAPwH6AzsAAYC8TXPmb9utfqEbhicAYTZq7j95OXckJ2O88WPn6Su72IayfMYWV+AXec0ZPxJ3SL2FH/tBYJvPqTwfx+8lL+OW0tizbv4bHL+5MWSHA7tO94e/4mnpiymsuP78IVgzPcDkcEcLofDchozYCM1vzqjJ6s21HEJ6HuHc/8bw1PTFlN6+Q4RuWkMbp3GiOy2pHcgKlGr8/ewMJNe3j40mM0RUl8LSrK0MNH23SHqxI7D/jGWjsMaA/cBGy01vYDWgGjgSvqOCa1xEZH8Zsze7FmexETZqxzOxzf+3x5Puc8NpW8ghJe/NEgrj2xe8QWztVio6O495w+PHzpMSzY6GzrPWedd1Y9L9i4m1/8ZwGDurbm3rP7RPz/b/GvjDbJ/Hh4V179yWDm3DWaRy/rz4istnyyNI/rXp5L/999zNh/fsVLM3LZtHvfQW+rsMzypw+WMSizteenVIk0hpxgim+KZxOOwV5jTApQBZQBXwJrgTestW8YY24D2gEZtY9Za++o47bGA+MBgsHggIkTJzZ6vIdSWFhISop7c9Gstfx5dgm5e6t4cEQSKXGHX1y4nUtjasxcrLVMWlPOmyvL6RSI4pb+8bRLappR/qY8JxsKqnh0Xgk79lku6xnHyV1iGrVYbWguu0uq+O2MEqIM3DM0kRZH8NhubH55rvglD/BuLpVVlpW7q5iXX8H8/Eryip331c6BKI5Ji6Z/WjSZLaKIqvFc++c3hXy5xfDboQl0aRHZrem8el4ayi95gDdz+TC3nNeWlfHIqCRaxNf/td6tXEaNGjXHWjuwrsvC8j2RtbYQwBgzC9gCtAH2hC7eC+Qc4Fhdt/U08DTAwIED7ciRI8MR8kFNmTIFN+63pg69Cjjj4f8xuySNe0/tc9i344VcGktj5VJYWsHtr3/DByu3cu4xHfjj+UeTGNd0b2ZNfU7OOaWc2/41n5eX5lOU0I4//KBvo+XbkFxKyiu59OmZlFSV8cb1Q+ndwVsdZfzyXPFLHuDtXE6u8fPqbYV8ujSPT5bkM3nNTt5dXU67QDwn93T6SbdOjuPLD6YzdkgGY885yrWYG4uXz0tD+CUP8GYu0Su38dqyr2jbo2+D1rV4MZdwzXluAxQCQ4HPgB5A9d66qcB2IKWOY3IAOekBLh3UhZdnruPKIRmuNvP3kzXbChk/YQ5rtxdx51m9+PHwrr6fNpCaGMszYwfy6Ger+PunK1i2tYCnrhjQpN0trLX85q1FzN+wmyd+eKznCmeRI9G9XQrd26Uw/oTu7Coq4/Pl+Xy6NJ9JC7Yw8esNAARi4bbRdY4ZifhSdbu6FVsLIn5ReLi+l/4ZcJG1thIoBn4PnBq67CTgc+DTOo7JQdw2OpvE2Gj+MHmp26H4wqdL8zj3sWnsLCpjwo8Gcc2IyF0Y2FBRUYafnpLFP8cdx6ZdxYx59Es+X5bfZPf/3NS1vDF3I7eeksUZfds32f2KNLVWyXGcf2wnHv/hscy9azQv//h4rhnelfFHx5OaFL7e0SJe0y4QT2piLCvyC90O5YiFq3h+HPiRMWYGsAN4DuhojFkA7MQpnF+p45gcRNuUeG48qQefLsvny5Xb3A4nYlVVWR7+ZCU/fnE2GW2TeOemYQztEdmfgg/XqJw0Jt08go6tkvjRi1/z909WUFUV3qY3U5bn84f3lnLGUencovZc0ozExUQxPKstd47pTd926q4hzYsxhpxggBVbI3/RYLjmPG/CGU2uaUyt30vrOCaHcPWwTF6dtZ77Jy1l8i1tiFHrugYpKCnntte/4eMleZzfvyN/OL8vCbGRvVjnSHVpk8Sb1w/lN28t5O+frGTBxj387eJjwjIqtnpbITe/No+c9Bb85eJ+2npbRKQZyU5P4e35m7HWRvQ3vaq8Ikx8TDR3nNGT5XkF/Gv2BrfDiSir8gs59/FpfLYsn3vO7s1fLu7X7Avnaolx0fzl4n7cd24fvly5jXMen8rSLXsb9T727CvnJy/OJi46imfGDoi4TWdEROTI5AQDFJRUsHVviduhHBEVzxHo9KPSGdS1NX/9aAV7S8rdDicifLh4K+c9Po09xeW8cs3xXD3M/wsDG8oYw5VDMpk4fggl5ZX84B/T+O+8TY1y25VVlltem8f6ncU8ccUAOrXS1tsiIs1N1v5tuiN76oaK5whkjOGus3qzs7iMxz9f5XY4nlZVZfnrR8u5dsIcurdL5t2bhzO4Wxu3w/K0ARmtePfm4RzdqSW3/ms+976zmLKKqiO6zQc/WMYXK7bxu3OPYlDX1o0UqYiIRJLsUPG8Mi+yFw2qeI5QfTulcn7/Tjw/NZf1O4rdDseT9uwr55qXZvPIZ6u4aEAn/nXtEDq0THQ7rIiQFkjglWuO58fDu/LC9Fwuf2Ym+Yf5Ndsbczby9P/WMHZIBpcf36WRIxURkUjROjmOdoF4lkf4ToMqniPYL07PITrK8MD7al1X28q8As57fBr/W7GN+87tw58uPFrzmxsoNjqKu8b05pHL+rN4817OenQqX+c2bFvvuet3ccebCxnSrQ13jekdpkhFRCRS5AQDEb9Nt4rnCBZskcD1I7vz/qKtzFqzw+1wPOP9hVs47/FpFJRU8Nr4wVw5JFPzm4/AOf068N8bh5ESH8NlT8/k+WlrsfbQ7ey27inh2glzCKbG848fHkusOsOIiDR72aHiOdxtUcNJ72YR7icjutE+NYH7Jy+N6AdiY6issvzpg2Vc/8pcsoIBJt08nOMyNb+2MeSkB3j7pmGMzEnjt+8u4dZ/zae4rOKA1y8pr2T8hNkUl1bw7NjjaJUc14TRioiIV2UHUygpr2LDrsidcqriOcIlxkXzy9N7snDTHt5spM4IkWhPcTk/euFr/jFlNZcN6sy/rh1MemqC22H5SouEWJ6+cgC3n5rNO99s5vx/TCd3e9H3rmet5ZdvLGDhpj38/dL+5KQHXIhWRES8KDv0nrAighcNqnj2gXP6daBf55b86YNlFJUeeDTQr5Zt3cvZj01l+urt/OEHfXng/KOJj9H85nCIijLcdFIWL1w9iK17Szj7sal8ujTvO9d58os1vD1/M7efmsPo3kGXIhURES/KSksBiOh5zyqefSAqynD3mF7kF5Ty1Ber3Q6nSU1asJkfPD6dkvJKJo4fom4OTeTE7Ha8e9NwurRO4scvzuavHzvbes/Pr+BPHy5jzNHtuWFkd7fDFBERjwkkxNKxZWJE93rWFl8+MSCjNWf368DTX67h0kFdfN+SraKyiteXl/He2nkMyGjFEz88lrQWmqbRlDq3TuKN64dy538X8cinK5mzbidz1pbSu30LHrqwnxZpiohInXLSI7vjhkaefeSXp+dgLfzpg2VuhxI2+XtLeG/hFsb+8yveW1vOFYO78NpPBqtwdklCbDQPXXg09593FF+t3UlcNDwzdiCJcZo2IyIidcsKprB6WyHllUe2AZdbNPLsI51aJXHNiK48/vlqrhqaSf8urdwO6YhUVllW5BUwe90u5uTuZM76XWzYuQ+ApLhorj4qjnvO6+tylGKM4YrBGQzu1oZ5s7/y/bceIiJyZHKCAcorLet2FNEjLfIWlat49pnrR/bg9dkbuW/SEt64fmhEfXVeVFrB/A27mZ27i9nrdjJ//W4KQgsg26bEMzCjFVcNyWRARiv6dEhl+tT/uRyx1NQjLYWNSfoyS0REDq56m+7lWwtVPIv7UuJjuP3UbH75xkLeXbCFc/p1cDukA9q8e9/+UeXZ63axdMteqiwY43wqPeeYDgzIaMXAjNZ0bp0YUR8EREREpG490lKIMrA8r4CzaO92OA2m4tmHLhzQmRenr+PB95dxau+gJ7alrqisYtnWAmaHCuU563axZU8J4EzBOKZzS24c1YMBGa3o36UVqYmxLkcsIiIi4ZAQG01mm2RWRGjHDRXPPhQdZbhrTG8ue2Ymz01dy42jejR5DHtLypm3fvf+UeX5G3ZTXFYJQPvUBAZktNo/qtyrfYAYbd0sIiLSbGQFUyK244aKZ58a0r0Np/YO8o/PV3HRgE5h7UZhrWXjrn3MXreT2bnOqPLyvAKshSgDvdq34KIBnTg2oxUDM1vTUQvKREREmrWcYICPl+RRUl7piW/IG0LFs4/9+sxejP7bF/z5o+X86cJ+jXa7ZRVVLNmyl9m5O5mzbhez1+1iW0Ep4My57t+lJWcc1Z4BGa04pktLUuL1MBMREZFvZacHqLKwelshfTqkuh1Og6iq8bHMtslcNSST56atZeyQTI7qeHgPzt3FZcxdvyvUBWMXCzbupqTc6c3YqVUiw7q3YUBmawZmtCI7GCA6Sgv7RERE5MByQh03VuQVqHgWb7n55CzemLuR+ycv4bWfDD7k9a21rN1exJzQor7Z63axKr8QgJgoQ58OLbh8UAYDM505y0FtTiIiIiINlNk2mdhow/KthW6H0mAqnn0uNTGW20Znc9fbi/loSR7xtS4vrahk4cY9+wvluet2saOoDIAWCTEMyGjFD/p3ZEBGK/p1aqmd40REROSIxUZH0a1tZC4aVPHcDFw2qAsvzVjHH95byq19LR8t3rq/WF64cQ9loe0xu7ZNZmROGgMzWzEwoxXd26UQpSkYIiIiEgbZ6QHmrd/ldhgNpuK5GYiJjuI3Z/Vi3PNf839TAOYQFx1F306pjBuWub9tXNuU2uPSIiIiIuGRE0zh3W82U1haEVHNBSInUjkiI3PSuPOsXqxYuYqLTxrIUR1TI641jIiIiPhH9TbdK/MK6N+llcvR1J92pmhGrhnRjTO7xTEws7UKZxEREXFVTvq3HTciiYpnEREREWlynVslkRAbFXEdN1Q8i4iIiEiTi4oyZKUFWJmvkWcRERERkUPKDgZYvlXFs4iIiIjIIeWkp5BfUMqu0B4TkUDFs4iIiIi4IjsYeYsGVTyLiIiIiCtUPIuIiIiI1FP71AQC8TGsyIucjhsqnkVERETEFcYYstMDLNfIs4iIiIjIoWUHA6zIK8Ba63Yo9aLiWURERERckxNMYXdxOdsKSt0OpV5UPIuIiIiIa75dNBgZ855VPIuIiIiIa7LTneI5UuY9q3gWEREREde0TYmnTXIcKyJkp0EVzyIiIiLiquxg5HTcUPEsIiIiIq7KSQ+wMkI6bqh4FhERERFXZQVTKCqrZNPufW6HckgqnkVERETEVTkRtE23imcRERERcVVWqHhevtX77epUPIuIiIiIq1ITY2mfmqCRZxERERGR+sgOBlgeAe3qVDyLiIiIiOuygyms2lZIZZW3O26oeBYRERER12UHA5RVVLFuR5HboRyUimcRERERcV1OemR03FDxLCIiIiKu65GWgjHe77ih4llEREREXJcUF0OX1kkaeRYRERERqY+stICKZxERERGR+shJT2Ht9iJKKyrdDuWAwlY8G2NeNMbMNMa8Y4xJMcZMMsZ8Y4yZYBwJtY+FKxYRERER8b7sYICKKsva7d7tuBGW4tkYMxyIsdYOBloAPwI2Wmv7Aa2A0cAVdRwTERERkWaquuOGlzdLCdfIcx7wcI37uBf4OPT7Z8Ao4KQ6jomIiIhIM9WtbQoxUcbT856NteHbxcUY8wPgp0Al8IC19hNjzDXAcUAm8FDNY9baa+u4jfHAeIBgMDhg4sSJYYv3QAoLC0lJSWny+w0H5eI9fskDlIsX+SUPUC5e5Zdc/JIHRH4uv/6ymGByFD89NsG1XEaNGjXHWjuwrstiwnWnxphzgFuAs4EngdTQRanAdiCljmPfY619GngaYODAgXbkyJHhCvmApkyZghv3Gw7KxXv8kgcoFy/ySx6gXLzKL7n4JQ+I/Fz6b5rLos17GDlypCdzCdec53Tg58AYa20B8Clwaujik4DPD3BMRERERJqx7GCA9TuLKS6rcDuUOoVrzvNVQHvgQ2PMVCAW6GiMWQDsxCmcX6njmIiIiIg0YznpKVgLq/K9udNgWKZtWGsfBB6sdfipWr+XAmPCcf8iIiIiEpmyg9923Gjncix10SYpIiIiIuIZGW2SiYuJYqVHR55VPIuIiIiIZ0RHGXq0S/Fsr2cVzyIiIiLiKTnpAc/2elbxLCIiIiKekh0MsGVPCUXl4duP5HCpeBYRERERT8kOOhujbC6scjmS71PxLCIiIiKeUt1xY5OKZxERERGRg+vYMpHkuGg2Fqh4FhERERE5qKgowwe3nsClPePcDuV7VDyLiIiIiOd0bp1ETJRxO4zvUfEsIiIiIlJPKp5FREREROpJxbOIiIiISD2peBYRERERqScVzyIiIiIi9aTiWURERESknlQ8i4iIiIjUk4pnEREREZF6UvEsIiIiIlJPKp5FREREROpJxbOIiIiISD2peBYRERERqSdjrXU7hnozxmwD1rlw122B7S7cbzgoF+/xSx6gXLzIL3mAcvEqv+TilzxAuTSGDGttu7ouiKji2S3GmNnW2oFux9EYlIv3+CUPUC5e5Jc8QLl4lV9y8UseoFzCTdM2RERERETqScWziIiIiEg9qXiun6fdDqARKRfv8UseoFy8yC95gHLxKr/k4pc8QLmEleY8i4iIiIjUk0aeRURERETqScWziIiIiEg9qXgWEREREaknFc8iIuILxhjjdgyNRbl4j1/yAOVypFQ8HwFjTJQx5mfGmJONMRlux3MklIv3+CWPan7Jxy95gL9yAbDWWmOML97XlIv3+CUPUC5HSt02DlPok87bwA6gBbAJmGat/ZergR0G5eI9fsmjml/y8Use4LtcLgIustZeHPo9ylpb5XJYh0W5eI9f8gDl0lh88anDJW2BeOB2YDywCDjdGHOmq1EdHuXiPX7Jo5pf8vFLHuCvXJKAC40x/wWw1lZF8KiacvEev+QByqVRROr/MNcYRxuc0ZqZwPnAXuBNnDefQaHreH4+kXLxHr/kUc0v+fglD/BPLqEQW4Z+nQK0BjZHYlGgXLzHL3mAcglLHJq2UX+hE/IvIBj61wBnAM8B7+GM4rwNXGGt3ehWnPWhXLzHL3lU80s+fskD/JNLjTzSgUnABGvt5tBlLwHJ1toLXAyx3pSL9/glD1Au4RIRnzQ85FZgJ3A9cCEwG+dN5xLgt8ANOG8+FS7F1xC3oly85lb8kUe1W/FHPrfijzzAP7ncipPHtcBZwDHVF1hrxwLRxphXXIms4W5FuXjNrfgjD1AuYaHiuWEW4IzWL8b51HOhtfZN4K84b0KZwI+ttVvdC7HelIv3+CWPan7Jxy95gH9yqc5jCc50k9Hwbcsqa+15wM9di65hlIv3+CUPUC5hEdMUdxLJQl8T/AT4CsgDHjfGxAIbgC6hq1UB/7PW/tudKOtHuXiPX/Ko5pd8/JIH+CeXg+SxmW/zON4Ys9dau6T661wvUi7e45c8QLk0RVwaeT6I0KeZt4FRwL3AFUAXa205sB1YZIwZDvwBj/+/VC7e45c8qvklH7/kAf7JpR55LA3lcR/O17qepVy8xy95gHJpKhp5PrhuQAA4B+gKnAecb4zZCqwHXgFycb7m3OJSjPWlXLzHL3lU80s+fskD/JNLQ/Lw+pQT5eI9fskDlEuT8OxIg9uMMXE4J2cWcDGwFvh36N8TcT7lvImzKn2JW3HWh3LxHr/kUc0v+fglD/BPLn7JA5SLF/klD1AuTRqfWtV9V2h+zatAKs6nmk7AIOBR4AugO/AYzichrLWl7kR6aMrFe/ySRzW/5OOXPMA/ufglD1Au7kR6cH7JA5SLG3Fq2sb3/QZnUvo/cVZt3gIU4ExYHwbswfkaIWCt3e5WkPWkXLzHL3lU80s+fskD/JOLX/IA5eJFfskDlEuT07SN71sOYK39CJgH/MBa+zjwAs4JHQb8JAIegKBcvMgveVTzSz5+yQP8k4tf8gDl4kV+yQOUS5PTyPP3TQO2hVqhLAE6h47nAzOA56y1VW4F10DKxXv8kkc1v+TjlzzAP7n4JQ9QLl7klzxAuTQ5jTzXYq3dBMwMtULZi9MKZSROK6dEL5y0+lIu3uOXPKr5JR+/5AH+ycUveYBy8SK/5AHKxQ3NfuTZGGNsrVWT1tp9oR+3A6/hrO4cb63Nb+r4jlSk5uKX8+KXPKoZY6Jqv3hFcj41RWoeOife46dz4pdc/JLHgURqLpH6HtmsR57rOmm1rAQ+AMZZD7d1MY4xxpjAQa4WEblU88N5Af/kUe0Qn/ojJp9Q8/0DiZg8QOfEi/xyTsA/uVhrq0KdHOoSEXmE3uu7HuJqEZELRHYN1ixb1YWeQG8Di4F/WGvXh44ba62teUKNMQFrbYGL4R5UjVw6AJdaa1caY6KttZWhyyMtlweBcuA1a+3CWvFHRC6hPO7B2fL4X8A6a+2+SHx8wf58ngUsMAmYZ63NrR7JiaR8jDGjrLWfh37+zgt3hOURBUwAonEeYx9Za4tqXB5JueiceEwol8eBSuB5a+2cmiO3EZbLA0Aba+340O8x1tqK0M+RlEcU8A7wlrX2uRrHI+59xQ81WHMdeR6P0y9wEnCxMaaTMSaxxot2YvUVvXjSankTmI3TD/HvANWFc0hC9Q8RkMvTgAFWAw8YYxJqfSqNlPMyAWgBbAQewdkRqVWNXCLpnAA8gdMq6ENgJPALY0zvGiNSkXJeACYaY34CzrcCtUY7I+m83A9sxhmVuQkI1ro8Is5J6E30X8aYayHiz8kDwBac50nEnpOQR4AiYD5wvzEmrtYIdETkYoyJB1oDpxpj/gFQXTiHRNLj63NgurX2OWPMNcaYbsaYpAitWyK+Bmt2xbMxJhFYhdN4+zbgeOBF4FxjTJwxJgf4lTHG8/PBjTH9gZettb+11v4V2GKMubrG5dnAHRGSSxJOIfB16FN1KXCNMWawMSbZGNODCDgvoakznwEbQ3msB0YBx4Uu702EnJMa1gG51trXgeeAHcAVxpiWoceY588LgDGmJ1AG/NwYczN8O60mkp4rIVuBImvtCzjb055XfYExpjsRkIsxph3OSvoi4FZjzK0Qmeck9CFgJbDbWvs8sIEIPCewv+D8AphhrX0WaAncbYw5McJei9tYZwON14F7gQ3GmDeNMTeFLj+KyDknPXF21ysxxnwIXAD8AzjbGBMVutzz5wT8U4M1m2kboRe313FeCOYApwCzrLU3GGOuBK7E6R24zhjT2lq7071oD858uwNPO+B9YK619jNjzHnAAGvtXaHrJQNx1tpdrgV7CLXOywJgAM4K21bAy8AI4EFr7QIvn5daeSwDzsYZtVmP86Z6CU4u0TjN3T2ZR03GmBustf8wxpyM8/z4S2gqzfHAz4DfhKYJefa8ABhjrrPWPlnj92RgJvC0tfbRGsc8/VyB75yTNJwPZO8DNwL7rLXPGmP64Dx/Cqy1u10M9YBCz5WJOCOC/wXmW2unGmPmAS9Yax8OXc/z5ySUy79xdkNbhVM8/8oYcz1Qaa19OhLOCXznNSwVZwBgg7X2ZWPME8A2nP66P7PWzvfyc77G46sNzvOjM05/4Dk4Rdo0a+0Foet6Ng/Yn8trOLm8A4wFPrTW/sYYcx3O+8olOOenVQTk4osaDJrXyPOdOCMcY4FiIB24yBhzkbV2Ak4PwdMBvH7ScHIpA64CkoCxxphzgI+AETVG1Yq8/MYTcifO+RiLs3PQRpwC83ehgmcXcDJ4/rxU53ElzgrhRThF80+ttY/g9Kvsa60t93geNf2fMeZla+2nOCOdPzfGDLXWzsKZxhEJ5wXgZ8aYN6p/Cc1DPRe42hjzi+pjEfBcAeecTLTW5ltrJ4e+Si8G1hpjTgF+CxR7uUjDea7sA36EU0BfZ5xWVGcAVxpjfgkRc06q31euxJlGkxl6Ld4NrDTGjCYyzgl8+xp2NRALnG6MOdlae7219m5gDTAcPP+cr358XYUzLSMDZ6T2LuBaYJMx5u/g+TzAyaUU55y0wpmDXgIQen/cBAyyjkjIxS81WLMqnr/GecPfjjM3+H6cJ9gVxpg3gW7AJ65F1zBf44xkbMWZjzoD540nGrgDOD709drBVq97RXUu23Fy+QIYCtxujHkQZyT6XffCq7fqPHYAj+EshmiDU7jNAY7FGf3wvNDXgKk4c8/bGmNesNb+ClgKjDfGvIWTj6efL7XySAg9zwGw1q4BLgbOMca08vpzpVYuLWp+GMB5XXsauBu421q7w40YG6D6tXgzznP+S+BSnNfjS4mQcxJS+/Xrc5xpWl2BZ4iccwLff1/5Emdg5lFjzJ+BPjgjuV5X/fjaCjyJMx1wIXCftfZtnHPyR/fCa5Ca5+RRnC2rexhj/hb6ANAL+Ma98BrETzVYsyqe5+N8cjsT51PPazgvDhOBXwIXW2tXuxZdw8zHyWUMsBOnUAsAo621M4AbQqM2kTAnZz7fnpcdOKvUP8CZZzsLuNpau8q16OpvPt/msQvnnMTgvGDcAFxord3qWnQNYK2tstbusdaebq09HUgyxrxorX0A+ClO540LvH5eauVxFs58wZoF9CpgpLV2l9efK7VyORMoDX2IAecr9rnAj63H2jkdwHy+//qVApwaSeckZD5OLmfh5PIOzofmMuBj4EcRck7g++flLSAO59vNz3DahUXCe+R8vs1jN04e0Th5YK3dHSmvxXz38bWHb89JAOd98nJr7QbXomuY+finBms+xbO1dgvwF5xVnpfgfH2wCOcrj5XW2o1uxtcQtXK5DGe+02LgBGOMsdbudTO+hqgjlxLgK6DQWvumtXaZm/HVVx157MCZ+3yutXaWtXatm/EdDmNMNIC19mIgyhjzUaiAmxwauY0INfK4HCgwxnxafZn97sp7z6uVy97QOdmOU6StdDe6+jnI69ew0LzIyoP8uafUkUs+zvtKF0JrAlwMr0HqyGU3oZFPa+171toVLoZXb7XyuBRnpHMJcKIJcTO+hjjIOSmw1n5grV3uYngN4qcaDJrRgsFqxpi+wI+BLJzeyJdFSoFWm49z6YjTszricvHTOYHv7spljHkKuD+CRjr2qyOP+yLtxbparVyeBe6xzpa2EcVPz5VauXTG+aYpIorN2vRa7D1+OSfgn/PS7Ipn2N+KJw2oisQ3nZqUi/f4JY9qNYu1SOaXPMA/ufjpuaJcvMcveYBy8ZpmWTyLiIiIiByOZjPnWURERETkSKl4FhERERGpJxXPIiIiIiL15Om9w0VE5NCMMX8DTsDpMV6tj7W2fY3rvIizcccMnA1itgBl1trpTRmriEik08iziEjkqwB+Zq09pfo/YH9LQWNMC5xdIWfgbKs+Aqdn7IUuxCoiEtFUPIuIRL66Nnup2cpuPPCJtbYSZ5fIR62184FBocJaRETqSdM2REQiXxXwF2NMzWkbQQBjTBvgFuBVY8zZwD5r7dLQdf4GPGuM+aG1trxJIxYRiVAaeRYRiXzxfH/aRl7osouAx4FWwJ+AbcaYHcaYKThzoEuAUS7ELCISkTTyLCIS+VoBDxpjCmocCwJYa580xgwMXWcwUAh0sNaea4z5xFo7tunDFRGJXCqeRUQi3zBgmLV2R/UBY8zM2ley1u4xxgwDloUOVTZRfCIivqFpGyIiEcwYMwLYWrNwDomu8XMUEGWMiQbuBl42xsQAsU0UpoiIb6h4FhGJbA8C99U8YIz5AFhZ41A8EAfcC3yGMx96LTC1aUIUEfEPY611OwYRETlMxpgka21xrWPx1trSOq4bY62tCP0cZa2tqn0dERE5OBXPIiIiIiL1pGkbIiIiIiL1pOJZRERERKSeVDyLiIiIiNSTimcRERERkXpS8SwiIiIiUk//D0Xq6rBiKdRmAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt #导入Matplotlib的pyplot模块\n",
    "#构建月度的订单数的DataFrame\n",
    "df_sales['消费日期'] = pd.to_datetime(df_sales['消费日期']) #转化日期格式\n",
    "df_orders_monthly = df_sales.set_index('消费日期')['订单号'].resample('M').nunique()\n",
    "#设定绘图的画布\n",
    "ax = pd.DataFrame(df_orders_monthly.values).plot(grid=True,figsize=(12,6),legend=False)\n",
    "ax.set_xlabel('月份') # X轴label\n",
    "ax.set_ylabel('订单数') # Y轴Label\n",
    "ax.set_title('月度订单数') # 图题\n",
    "#设定X轴月份显示格式\n",
    "plt.xticks(\n",
    "    range(len(df_orders_monthly.index)), \n",
    "    [x.strftime('%m.%Y') for x in df_orders_monthly.index], \n",
    "    rotation=45)\n",
    "plt.show() # 绘图"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据清洗"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_sales = df_sales.drop_duplicates() #删除重复的数据行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "订单号     0\n",
       "产品码     0\n",
       "消费日期    0\n",
       "产品说明    0\n",
       "数量      0\n",
       "单价      0\n",
       "用户码     0\n",
       "城市      0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_sales.isna().sum() # NaN出现的次数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>数量</th>\n",
       "      <th>单价</th>\n",
       "      <th>用户码</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>85920.000000</td>\n",
       "      <td>85920.000000</td>\n",
       "      <td>85920.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>10.115747</td>\n",
       "      <td>3.599711</td>\n",
       "      <td>15338.080389</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>49.114285</td>\n",
       "      <td>134.410498</td>\n",
       "      <td>391.309086</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-9360.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>14681.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.250000</td>\n",
       "      <td>15022.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>4.000000</td>\n",
       "      <td>1.950000</td>\n",
       "      <td>15334.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>12.000000</td>\n",
       "      <td>3.750000</td>\n",
       "      <td>15673.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>3114.000000</td>\n",
       "      <td>38970.000000</td>\n",
       "      <td>16019.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 数量            单价           用户码\n",
       "count  85920.000000  85920.000000  85920.000000\n",
       "mean      10.115747      3.599711  15338.080389\n",
       "std       49.114285    134.410498    391.309086\n",
       "min    -9360.000000      0.000000  14681.000000\n",
       "25%        2.000000      1.250000  15022.000000\n",
       "50%        4.000000      1.950000  15334.000000\n",
       "75%       12.000000      3.750000  15673.000000\n",
       "max     3114.000000  38970.000000  16019.000000"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_sales.describe() #df_sales的统计信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_sales = df_sales.loc[df_sales['数量'] > 0] #清洗掉数量小于等于0的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>数量</th>\n",
       "      <th>单价</th>\n",
       "      <th>用户码</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>84112.000000</td>\n",
       "      <td>84112.000000</td>\n",
       "      <td>84112.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>10.760236</td>\n",
       "      <td>3.005032</td>\n",
       "      <td>15337.732963</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>34.018906</td>\n",
       "      <td>15.365085</td>\n",
       "      <td>392.074855</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>14681.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.250000</td>\n",
       "      <td>15021.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>5.000000</td>\n",
       "      <td>1.950000</td>\n",
       "      <td>15333.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>12.000000</td>\n",
       "      <td>3.750000</td>\n",
       "      <td>15674.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>3114.000000</td>\n",
       "      <td>3155.950000</td>\n",
       "      <td>16019.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 数量            单价           用户码\n",
       "count  84112.000000  84112.000000  84112.000000\n",
       "mean      10.760236      3.005032  15337.732963\n",
       "std       34.018906     15.365085    392.074855\n",
       "min        1.000000      0.000000  14681.000000\n",
       "25%        2.000000      1.250000  15021.000000\n",
       "50%        5.000000      1.950000  15333.000000\n",
       "75%       12.000000      3.750000  15674.000000\n",
       "max     3114.000000   3155.950000  16019.000000"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_sales.describe() #df_sales的统计信息"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征工程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>订单号</th>\n",
       "      <th>产品码</th>\n",
       "      <th>消费日期</th>\n",
       "      <th>产品说明</th>\n",
       "      <th>数量</th>\n",
       "      <th>单价</th>\n",
       "      <th>用户码</th>\n",
       "      <th>城市</th>\n",
       "      <th>总价</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>536374</td>\n",
       "      <td>21258</td>\n",
       "      <td>2020-06-01 09:09:00</td>\n",
       "      <td>五彩玫瑰五支装</td>\n",
       "      <td>32</td>\n",
       "      <td>10.95</td>\n",
       "      <td>15100</td>\n",
       "      <td>北京</td>\n",
       "      <td>350.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>536376</td>\n",
       "      <td>22114</td>\n",
       "      <td>2020-06-01 09:32:00</td>\n",
       "      <td>茉莉花白色25枝</td>\n",
       "      <td>48</td>\n",
       "      <td>3.45</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>165.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>536376</td>\n",
       "      <td>21733</td>\n",
       "      <td>2020-06-01 09:32:00</td>\n",
       "      <td>教师节向日葵3枝尤加利5枝</td>\n",
       "      <td>64</td>\n",
       "      <td>2.55</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>163.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>536378</td>\n",
       "      <td>22386</td>\n",
       "      <td>2020-06-01 09:37:00</td>\n",
       "      <td>百合粉色10花苞</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>19.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>536378</td>\n",
       "      <td>85099C</td>\n",
       "      <td>2020-06-01 09:37:00</td>\n",
       "      <td>橙黄香槟色康乃馨</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>19.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      订单号     产品码                消费日期           产品说明  数量     单价    用户码  城市  \\\n",
       "0  536374   21258 2020-06-01 09:09:00        五彩玫瑰五支装  32  10.95  15100  北京   \n",
       "1  536376   22114 2020-06-01 09:32:00       茉莉花白色25枝  48   3.45  15291  上海   \n",
       "2  536376   21733 2020-06-01 09:32:00  教师节向日葵3枝尤加利5枝  64   2.55  15291  上海   \n",
       "3  536378   22386 2020-06-01 09:37:00       百合粉色10花苞  10   1.95  14688  北京   \n",
       "4  536378  85099C 2020-06-01 09:37:00       橙黄香槟色康乃馨  10   1.95  14688  北京   \n",
       "\n",
       "      总价  \n",
       "0  350.4  \n",
       "1  165.6  \n",
       "2  163.2  \n",
       "3   19.5  \n",
       "4   19.5  "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_sales['总价'] = df_sales['数量'] * df_sales['单价'] #计算每单的总价\n",
    "df_sales.head() #显示头几行数据  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构建User用户表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户码</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>14681</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>14682</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>14684</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>14687</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>14688</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>975</th>\n",
       "      <td>16015</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>976</th>\n",
       "      <td>16016</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>977</th>\n",
       "      <td>16017</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>978</th>\n",
       "      <td>16018</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>979</th>\n",
       "      <td>16019</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>980 rows × 1 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       用户码\n",
       "0    14681\n",
       "1    14682\n",
       "2    14684\n",
       "3    14687\n",
       "4    14688\n",
       "..     ...\n",
       "975  16015\n",
       "976  16016\n",
       "977  16017\n",
       "978  16018\n",
       "979  16019\n",
       "\n",
       "[980 rows x 1 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.DataFrame(df_sales['用户码'].unique()) #生成以用户码为主键的结构df_user\n",
    "df_user.columns = ['用户码'] #设定字段名\n",
    "df_user = df_user.sort_values(by='用户码',ascending=True).reset_index(drop=True) #按用户码排序\n",
    "df_user #显示df_user"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 求R值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户码</th>\n",
       "      <th>R值</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>14681</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>14682</td>\n",
       "      <td>187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>14684</td>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>14687</td>\n",
       "      <td>106</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>14688</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     用户码   R值\n",
       "0  14681   70\n",
       "1  14682  187\n",
       "2  14684   25\n",
       "3  14687  106\n",
       "4  14688    7"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_sales['消费日期'] = pd.to_datetime(df_sales['消费日期']) #转化日期格式\n",
    "df_recent_buy = df_sales.groupby('用户码').消费日期.max().reset_index() #构建消费日期信息\n",
    "df_recent_buy.columns = ['用户码','最近日期'] #设定字段名\n",
    "df_recent_buy['R值'] = (df_recent_buy['最近日期'].max() - df_recent_buy['最近日期']).dt.days #计算最新日期与上次消费日期的天数\n",
    "df_user = pd.merge(df_user, df_recent_buy[['用户码','R值']], on='用户码') #把上次消费距最新日期的天数（R值）合并至df_user结构\n",
    "df_user.head() #显示df_user头几行数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 求F值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户码</th>\n",
       "      <th>R值</th>\n",
       "      <th>F值</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>14681</td>\n",
       "      <td>70</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>14682</td>\n",
       "      <td>187</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>14684</td>\n",
       "      <td>25</td>\n",
       "      <td>390</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>14687</td>\n",
       "      <td>106</td>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>14688</td>\n",
       "      <td>7</td>\n",
       "      <td>324</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     用户码   R值   F值\n",
       "0  14681   70    7\n",
       "1  14682  187    2\n",
       "2  14684   25  390\n",
       "3  14687  106   15\n",
       "4  14688    7  324"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_frequency = df_sales.groupby('用户码').消费日期.count().reset_index() #计算每个用户消费次数，构建df_frequency对象\n",
    "df_frequency.columns = ['用户码','F值'] #设定字段名称\n",
    "df_user = pd.merge(df_user, df_frequency, on='用户码') #把消费频率整合至df_user结构\n",
    "df_user.head() #显示头几行数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 求M值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户码</th>\n",
       "      <th>R值</th>\n",
       "      <th>F值</th>\n",
       "      <th>M值</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>14681</td>\n",
       "      <td>70</td>\n",
       "      <td>7</td>\n",
       "      <td>498.95</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>14682</td>\n",
       "      <td>187</td>\n",
       "      <td>2</td>\n",
       "      <td>52.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>14684</td>\n",
       "      <td>25</td>\n",
       "      <td>390</td>\n",
       "      <td>1201.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>14687</td>\n",
       "      <td>106</td>\n",
       "      <td>15</td>\n",
       "      <td>628.38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>14688</td>\n",
       "      <td>7</td>\n",
       "      <td>324</td>\n",
       "      <td>5579.10</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     用户码   R值   F值       M值\n",
       "0  14681   70    7   498.95\n",
       "1  14682  187    2    52.00\n",
       "2  14684   25  390  1201.51\n",
       "3  14687  106   15   628.38\n",
       "4  14688    7  324  5579.10"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_revenue = df_sales.groupby('用户码').总价.sum().reset_index() #根据消费总额，构建df_revenue对象\n",
    "df_revenue.columns = ['用户码','M值'] #设定字段名称\n",
    "df_user = pd.merge(df_user, df_revenue, on='用户码') #把消费金额整合至df_user结构\n",
    "df_user.head() #显示头几行数据"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
